﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using Clientes.Data;
using Clientes.Data.Interface;
using Controles;
using Facturacion.Data;
using Facturacion.Data.Interface;
using Microsoft.Reporting.WinForms;
using Stock.Data;
using Stock.Data.Interface;

namespace PapeleraEduardo.Componentes
{
    /// <summary>
    /// Lógica de interacción para componenteFacturacion.xaml
    /// </summary>
    public partial class componenteFacturacion : UserControl
    {
        public componenteFacturacion()
        {
            InitializeComponent();
        }

        bool _isDirty = false;
        bool _isDirtyItem = false;
        public int idSeleccionado = 0;
        int _posicionItemSeleccionado = -1;
        Articulo _articuloSeleccionado = null;
        Cliente _clienteSeleccionado = null;
        IClienteMethods<Cliente> _metodosCliente = new ClienteMethods<Cliente>();
        IArticuloMethods<Articulo> _metodosArticulo = new ArticuloMethods<Articulo>();
        IFacturaMethods<Factura> _metodosFactura = new FacturaMethods<Factura>();

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                if (idSeleccionado != 0)
                {
                    int id = idSeleccionado;
                    limpiarControlesItems();
                    limpiarControles();
                    
                    idSeleccionado = id;
                    Factura factura = _metodosFactura.GetById(idSeleccionado);
                    cargarObjetoEnControles(factura);
                    habilitarControlesItem(false);
                }
                else
                {
                    limpiarControlesItems();
                    limpiarControles();
                }
            }
            catch (Exception ex)
            {
                //TODO: logear excepcion
                MessageBox.Show(MensajeErrorHelper.MensajeErrorAbrirPantalla, "Error");
            }
        }

        private void limpiarControles()
        {
            habilitarControles(true);

            idSeleccionado = 0;
            
            txtFechaEmision.Text = DateTime.Now.ToString();
            txtFechaEmision.Background = Brushes.White;

            txtFacturaNumero.Text = "";

            txtCliente.Text = "";
            txtCliente.Background = Brushes.White;

            txtDomicilioCliente.Text = "";
            txtTelefonoCliente.Text = "";
            txtCuit.Text = "";
            chkResponsableInscripto.IsChecked = false;

            grdArticulos.ItemsSource = null;
            grdArticulos.Background = Brushes.White;

            chkDescuento.IsChecked = false;
            txtDescuento.Text = "";
            txtDescuento.IsEnabled = false;
            txtDescuento.Background = Brushes.White;
            
            chkImpuesto.IsChecked = false;
            txtImpuesto.Text = "";
            txtImpuesto.IsEnabled = false;
            txtImpuesto.Background = Brushes.White;
            
            chkIva.IsChecked = false;
            txtIVA.Text = "";

            txtSubtotal1.Text = "";
            txtSubtotal2.Text = "";
            txtSubtotal3.Text = "";

            txtTotal.Text = "";

            txtCliente.Focus();

            _clienteSeleccionado = null;
            _isDirty = false;
        }

        private void limpiarControlesItems()
        {
            _posicionItemSeleccionado = -1;

            txtAgregarArticulo.Text = "";
            txtAgregarArticulo.Background = Brushes.White;
            
            txtAgregarCantidad.Text = "";
            txtAgregarCantidad.Background = Brushes.White;
            
            rdbPrecio.IsChecked = true;
            rdbPrecioLista.IsChecked = false;

            habilitarControlesItem(true);

            txtAgregarArticulo.Focus();

            _articuloSeleccionado = null;
            _isDirtyItem = false;
        }

        # region IsDirty
        private void text_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            _isDirty = true;
        }

        private void text_TextChanged(object sender, SelectionChangedEventArgs e)
        {
            _isDirty = true;
        }

        private void textItem_TextChanged(object sender, TextChangedEventArgs e)
        {
            _isDirtyItem = true;
        }

        private void rdbPrecios_Checked(object sender, RoutedEventArgs e)
        {
            _isDirtyItem = true;
        }

        # endregion

        private bool validarDatos()
        {
            bool valido = true;

            if (_clienteSeleccionado == null)
            {
                valido = false;
                txtCliente.Background = Brushes.Coral;
            }
            else
                txtCliente.Background = Brushes.White;

            if (txtFechaEmision.Text == "")
            {
                valido = false;
                txtFechaEmision.Background = Brushes.Coral;
            }
            else
                txtFechaEmision.Background = Brushes.White;

            if (chkDescuento.IsChecked == true)
            {
                if (txtDescuento.Text == "")
                {
                    valido = false;
                    txtDescuento.Background = Brushes.Coral;
                }
                else
                    txtDescuento.Background = Brushes.White;
            }

            if (chkImpuesto.IsChecked == true)
            {
                if (txtImpuesto.Text == "")
                {
                    valido = false;
                    txtImpuesto.Background = Brushes.Coral;
                }
                else
                    txtImpuesto.Background = Brushes.White;
            }

            if (grdArticulos.Items == null || grdArticulos.Items.Count == 0)
            {
                valido = false;
                grdArticulos.Background = Brushes.Coral;

            }
            else
                grdArticulos.Background = Brushes.White;

            return valido;
        }

        private bool validarDatosItem()
        {
            bool valido = true;

            if (_articuloSeleccionado == null)
            {
                valido = false;
                txtAgregarArticulo.Background = Brushes.Coral;
            }
            else
                txtAgregarArticulo.Background = Brushes.White;

            if (txtAgregarCantidad.Text == "")
            {
                valido = false;
                txtAgregarCantidad.Background = Brushes.Coral;
            }
            else
                txtAgregarCantidad.Background = Brushes.White;

            return valido;
        }

        private void cargarObjetoEnControlesItem(ItemFactura obj)
        {
            _posicionItemSeleccionado = grdArticulos.SelectedIndex;
            _articuloSeleccionado = new Articulo();
            _articuloSeleccionado = obj.articulo;

            txtAgregarArticulo.Text = obj.articulo.descripcion;
            txtAgregarCantidad.Text = obj.cantidad.ToString();
            rdbPrecioLista.IsChecked = obj.usaPrecioLista;
            rdbPrecio.IsChecked = !obj.usaPrecioLista;

            habilitarControlesItem(true);

            _isDirtyItem = false;
        }

        private void cargarObjetoEnControles(Factura obj)
        {
            idSeleccionado = obj.id;

            _clienteSeleccionado = new Cliente();
            _clienteSeleccionado = obj.cliente;
            txtCliente.Text = obj.cliente.nombre;
            
            txtDomicilioCliente.Text = obj.cliente.domicilioLocalidad.ciudad.nombre + ", " + obj.cliente.domicilioLocalidad.nombre + ", " + 
                obj.cliente.domicilioCalle + " " + obj.cliente.domicilioNumero.ToString();
            txtTelefonoCliente.Text = obj.cliente.telefono;

            if (obj.cliente.cuit != "")
            {
                txtCuit.Text = obj.cliente.cuit;
                chkResponsableInscripto.IsChecked = true;
            }
            else
            {
                txtCuit.Text = "";
                chkResponsableInscripto.IsChecked = false;
            }

            txtFechaEmision.Text = obj.fechaEmision.ToString();

            txtFacturaNumero.Text = obj.numeroFacturaMostrar;
            
            grdArticulos.ItemsSource = obj.itemsFactura;
            calcularSubtotal1();

            chkImpuesto.IsChecked = obj.tieneImpuesto;
            if (obj.tieneImpuesto)
            {
                txtImpuesto.Text = NormalizarControlesHelper.normalizarDecimales(obj.impuesto.ToString(), 2);
                calcularSubtotal2();
            }
            else
                txtImpuesto.Text = "";
                        
            chkDescuento.IsChecked = obj.tieneDescuento;
            if (obj.tieneDescuento)
            {
                txtDescuento.Text = NormalizarControlesHelper.normalizarDecimales(obj.descuento.ToString(), 2);
                calcularSubtotal3();
            }
            else
                txtDescuento.Text = "";
            
            chkIva.IsChecked = obj.tieneIVA;
            if (obj.tieneIVA)
            {
                txtIVA.Text = NormalizarControlesHelper.normalizarDecimales(obj.IVA.ToString(), 2);
                calcularIVA();
            }
            else
                txtIVA.Text = "";

            
            habilitarControles(false);
            calcularTotal();

            _isDirtyItem = false;
            _isDirty = false;
        }

        private void habilitarControlesItem(bool habilitar)
        {
            txtAgregarArticulo.IsEnabled = habilitar;
            txtAgregarCantidad.IsEnabled = habilitar;
            rdbPrecio.IsEnabled = habilitar;
            rdbPrecioLista.IsEnabled = habilitar;
            btnIngresarArticulo.IsEnabled = habilitar;
            btnEliminarArticulo.IsEnabled = habilitar;
        }
        
        private void habilitarControles(bool habilitar)
        {
            txtCliente.IsEnabled = habilitar;
            txtFechaEmision.IsEnabled = habilitar;

            txtAgregarArticulo.IsEnabled = habilitar;
            txtAgregarCantidad.IsEnabled = habilitar;
            
            btnGuardar.IsEnabled = habilitar;
            btnImprimir.IsEnabled = !habilitar;

            chkImpuesto.IsEnabled = habilitar;
            chkDescuento.IsEnabled = habilitar;
            chkIva.IsEnabled = habilitar;

            txtImpuesto.IsEnabled = habilitar;
            txtDescuento.IsEnabled = habilitar;
        }

        # region Eventos

        private void txtAgregarCantidad_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtAgregarCantidad.Text != "")
            {
                if (!ValidacionControlesHelper.validaEntero(txtAgregarCantidad.Text))
                {
                    txtAgregarCantidad.Text = "";
                    MessageBox.Show(MensajeValidacionHelper.MensajeValidacionNumeroEntero, "Info");
                }
            }
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (_isDirty)
            {
                if (validarDatos())
                {
                    try
                    {
                        Factura item = new Factura();
                        item.id = 0;
                        item.cliente = new Cliente();
                        item.cliente = _clienteSeleccionado;
                        
                        if (chkDescuento.IsChecked == true)
                        {
                            item.descuento = float.Parse(txtDescuento.Text);
                            item.tieneDescuento = chkDescuento.IsChecked.Value;
                        }
                        else
                        {
                            item.descuento = 0;
                            item.tieneDescuento = false;
                        }

                        item.fechaEmision = DateTime.Parse(txtFechaEmision.Text);

                        if (chkImpuesto.IsChecked == true)
                        {
                            item.impuesto = float.Parse(txtImpuesto.Text);
                            item.tieneImpuesto = chkImpuesto.IsChecked.Value;
                        }
                        else
                        {
                            item.impuesto = 0;
                            item.tieneImpuesto = false;
                        }
                        
                        if (chkIva.IsChecked == true)
                        {
                            item.IVA = float.Parse(txtIVA.Text);
                            item.tieneIVA = chkIva.IsChecked.Value;
                        }
                        else
                        {
                            item.IVA = 0;
                            item.tieneIVA = false;
                        }

                        // Obtengo el numero
                        txtFacturaNumero.Text = _metodosFactura.obtenerNumeracion().ToString().PadLeft(6, '0');
                        item.numeroFactura = int.Parse(txtFacturaNumero.Text);

                        item.itemsFactura = new List<ItemFactura>();
                        item.itemsFactura = grdArticulos.ItemsSource as List<ItemFactura>;

                        idSeleccionado = _metodosFactura.Add(item);
                        item.id = idSeleccionado;

                        MessageBox.Show(MensajeGuardarHelper.MensajeActualizacionExitosa, "Info");

                        //Si se guardó bien la factura entonces voy a poder imprimir
                        habilitarControles(false);
                        habilitarControlesItem(false);

                        _isDirty = false;
                        _isDirtyItem = false;
                    }
                    catch (Exception ex)
                    {
                        //TODO: logear excepcion
                        MessageBox.Show(MensajeGuardarHelper.MensajeActualizacionFallo, "Error");
                    }
                }
                else
                    MessageBox.Show(MensajeGuardarHelper.MensajeValidacionActualizacion, "Info");
            }
            else
                MessageBox.Show(MensajeGuardarHelper.MensajeNoHayActualizacion, "Info");

            txtCliente.Focus();
        }

        private void grdArticulos_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (idSeleccionado == 0)
            {
                if (_isDirtyItem)
                {
                    MessageBoxResult rv = (MessageBox.Show(MensajeValidacionHelper.MensajeValidacionDatosModificados, "Info", MessageBoxButton.YesNo));
                    if (rv == MessageBoxResult.No)
                        return;
                }

                ItemFactura objSeleccionado = grdArticulos.SelectedItem as ItemFactura;

                if (objSeleccionado != null)
                    cargarObjetoEnControlesItem(objSeleccionado);

                txtAgregarArticulo.Focus();
            }
        }

        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            if (_isDirty)
            {
                MessageBoxResult rv = (MessageBox.Show(MensajeValidacionHelper.MensajeValidacionDatosModificados, "Info", MessageBoxButton.YesNo));
                if (rv == MessageBoxResult.No)
                    return;
            }

            RoutedEventArgs newEventArgs = new RoutedEventArgs(EventControlesHelper.CancelarClickEvent);
            RaiseEvent(newEventArgs);
        }

        private void btnLimpiar_Click(object sender, RoutedEventArgs e)
        {
            if (_isDirty)
            {
                MessageBoxResult rv = (MessageBox.Show(MensajeValidacionHelper.MensajeValidacionDatosModificados, "Info", MessageBoxButton.YesNo));
                if (rv == MessageBoxResult.No)
                    return;
            }

            limpiarControlesItems();
            limpiarControles();
        }


        private void btnIngresarArticulo_Click(object sender, RoutedEventArgs e)
        {
            if (_isDirtyItem)
            {
                if (validarDatosItem())
                {
                    try
                    {
                        ItemFactura item = new ItemFactura();
                        item.id = 0;
                        item.cantidad = int.Parse(txtAgregarCantidad.Text);
                        item.usaPrecioLista = rdbPrecioLista.IsChecked.Value;

                        item.articulo = new Articulo();
                        item.articulo = _articuloSeleccionado;

                        if (item.usaPrecioLista)
                            item.precio = float.Parse(_articuloSeleccionado.precioListaTotal);
                        else
                            item.precio = float.Parse(_articuloSeleccionado.precioTotal);


                        IList<ItemFactura> items = grdArticulos.ItemsSource as IList<ItemFactura>;
                        if (items == null || items.Count == 0) // No hay items en la grilla
                            items = new List<ItemFactura>();


                        if (_posicionItemSeleccionado == -1) //Es un item nuevo
                            items.Add(item);
                        else
                            items[_posicionItemSeleccionado] = item;

                        grdArticulos.ItemsSource = null;
                        grdArticulos.ItemsSource = items;

                        calcularSubtotal1();
                        calcularTotal();

                        limpiarControlesItems();
                    }
                    catch (Exception ex)
                    {
                        //TODO: logear excepcion
                        MessageBox.Show(MensajeGuardarHelper.MensajeActualizacionFallo, "Error");
                    }
                }
                else
                    MessageBox.Show(MensajeGuardarHelper.MensajeValidacionActualizacion, "Info");
            }
            else
                MessageBox.Show(MensajeGuardarHelper.MensajeNoHayActualizacion, "Info");

            txtAgregarArticulo.Focus();
        }

        private void btnEliminarArticulo_Click(object sender, RoutedEventArgs e)
        {
            if (_posicionItemSeleccionado != -1)
            {
                try
                {
                    ICollection<ItemFactura> itemsNuevos = new List<ItemFactura>();
                    for (int i = 0; i < grdArticulos.Items.Count; i++)
                    { 
                        if (i!= _posicionItemSeleccionado)
                            itemsNuevos.Add(grdArticulos.Items[i] as ItemFactura);
                    }

                    grdArticulos.ItemsSource = null;
                    grdArticulos.ItemsSource = itemsNuevos;

                    calcularSubtotal1();
                    calcularTotal();

                    limpiarControlesItems();

                    MessageBox.Show(MensajeEliminarHelper.MensajeEliminarExitosa, "Info");
                }
                catch (Exception ex)
                {
                    //TODO: logear excepcion
                    MessageBox.Show(MensajeEliminarHelper.MensajeEliminarFallo, "Error");
                }
            }
            else
                MessageBox.Show(MensajeEliminarHelper.MensajeNoHayObjetoParaEliminar, "Info");

            txtAgregarArticulo.Focus();
        }

        private void chkImpuesto_Checked(object sender, RoutedEventArgs e)
        {
            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
            {
                _isDirty = true;
                txtImpuesto.IsEnabled = true;
                txtImpuesto.Text = "";

                txtImpuesto.Focus();
            }
        }

        private void chkImpuesto_Unchecked(object sender, RoutedEventArgs e)
        {
            txtImpuesto.IsEnabled = false;
            txtImpuesto.Text = "";
            txtSubtotal2.Text = "";

            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
                calcularTotal();
        }

        private void txtImpuesto_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtImpuesto.Text != "")
            {
                txtImpuesto.Text = txtImpuesto.Text.Replace('.', char.Parse(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator));
                if (!ValidacionControlesHelper.validaDecimal(txtImpuesto.Text))
                {
                    txtImpuesto.Text = "";
                    MessageBox.Show(MensajeValidacionHelper.MensajeValidacionNumeroDecimal, "Info");
                }
                else
                {
                    calcularSubtotal2();
                    calcularTotal();
                }
            }
            else
            {
                txtSubtotal2.Text = "";
                calcularTotal();
            }
        }


        private void txtImpuesto_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtImpuesto.Text != "")
                {
                    txtImpuesto.Text = txtImpuesto.Text.Replace('.', char.Parse(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator));
                    if (!ValidacionControlesHelper.validaDecimal(txtImpuesto.Text))
                    {
                        txtImpuesto.Text = "";
                        MessageBox.Show(MensajeValidacionHelper.MensajeValidacionNumeroDecimal, "Info");
                    }
                    else
                    {
                        calcularSubtotal2();
                        calcularTotal();
                    }
                }
                else
                {
                    txtSubtotal2.Text = "";
                    calcularTotal();
                }
            }
        }

        private void chkDescuento_Checked(object sender, RoutedEventArgs e)
        {
            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
            {
                _isDirty = true;
                txtDescuento.IsEnabled = true;
                txtDescuento.Text = "";

                txtDescuento.Focus();
            }
        }

        private void chkDescuento_Unchecked(object sender, RoutedEventArgs e)
        {
            txtDescuento.IsEnabled = false;
            txtDescuento.Text = "";
            txtSubtotal3.Text = "";

            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
                calcularTotal();
        }

        private void txtDescuento_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtDescuento.Text != "")
            {
                txtDescuento.Text = txtDescuento.Text.Replace('.', char.Parse(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator));
                if (!ValidacionControlesHelper.validaDecimal(txtDescuento.Text))
                {
                    txtDescuento.Text = "";
                    MessageBox.Show(MensajeValidacionHelper.MensajeValidacionNumeroDecimal, "Info");
                }
                else
                {
                    calcularSubtotal3();
                    calcularTotal();
                }
            }
            else
            {
                txtSubtotal3.Text = "";
                calcularTotal();
            }
        }

        private void txtDescuento_KeyDown(object sender, KeyEventArgs e)
        {
            if (txtDescuento.Text != "")
            {
                txtDescuento.Text = txtDescuento.Text.Replace('.', char.Parse(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator));
                if (!ValidacionControlesHelper.validaDecimal(txtDescuento.Text))
                {
                    txtDescuento.Text = "";
                    MessageBox.Show(MensajeValidacionHelper.MensajeValidacionNumeroDecimal, "Info");
                }
                else
                {
                    calcularSubtotal3();
                    calcularTotal();
                }
            }
            else
            {
                txtSubtotal3.Text = "";
                calcularTotal();
            }
        }

        private void chkIva_Checked(object sender, RoutedEventArgs e)
        {
            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
            {
                _isDirty = true;

                calcularIVA();
                calcularTotal();
            }
        }

        private void chkIva_Unchecked(object sender, RoutedEventArgs e)
        {
            if (txtSubtotal1.Text != "" && txtSubtotal1.Text != "0")
            {
                txtIVA.Text = "";
                calcularTotal();
            }
        }

        private void txtCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter && txtCliente.Text.Trim() != "")
            {
                ICollection<Cliente> clientes = _metodosCliente.buscarClientes(txtCliente.Text.Trim());
                Cliente cliente = null;
                if (clientes.Count == 1)
                {
                    cliente = new Cliente();
                    cliente = (clientes as IList<Cliente>)[0] as Cliente;
                }
                else
                {
                    if (clientes.Count > 1)
                    {
                        buscarClientes form = new buscarClientes();
                        form.clientes = clientes;
                        form.ShowDialog();

                        cliente = new Cliente();
                        cliente = form.cliente;
                    }
                }                              

                if (cliente != null)
                {
                    txtCliente.Text = cliente.codigo + " - " + cliente.nombre;

                    txtDomicilioCliente.Text = cliente.domicilioLocalidad.ciudad.nombre + ", " + cliente.domicilioLocalidad.nombre + ", " +
                        cliente.domicilioCalle + " " + cliente.domicilioNumero.ToString();

                    txtCuit.Text = cliente.cuit;
                    if (cliente.cuit == "")
                        chkResponsableInscripto.IsChecked = false;
                    else
                        chkResponsableInscripto.IsChecked = true;

                    txtTelefonoCliente.Text = cliente.telefono;

                    _clienteSeleccionado = new Cliente();
                    _clienteSeleccionado = cliente;

                    txtAgregarArticulo.Focus();
                }
                else
                {
                    txtCliente.Text = "";
                    txtDomicilioCliente.Text = "";
                    txtTelefonoCliente.Text = "";
                    txtCuit.Text = "";
                    chkResponsableInscripto.IsChecked = false;

                    _clienteSeleccionado = null;
                    txtCliente.Focus();
                    MessageBox.Show("No existe el cliente.", "Info");
                }
            }
        }

        private void txtAgregarArticulo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter && txtAgregarArticulo.Text.Trim() != "")
            {
                ICollection<Articulo> articulos = _metodosArticulo.buscarArticulos(txtAgregarArticulo.Text.Trim());
                Articulo articulo = null;
                if (articulos.Count == 1)
                {
                    articulo = new Articulo();
                    articulo = (articulos as IList<Articulo>)[0] as Articulo;
                }
                else
                {
                    if (articulos.Count > 1)
                    {
                        buscarArticulos form = new buscarArticulos(); 
                        form.articulos = articulos;
                        form.ShowDialog();

                        articulo = new Articulo();
                        articulo = form.articulo;
                    }
                }                              
                
                if (articulo != null)
                {
                    txtAgregarArticulo.Text = articulo.codigo + " - " + articulo.descripcion;

                    _articuloSeleccionado = new Articulo();
                    _articuloSeleccionado = articulo;
                }
                else
                {
                    txtAgregarArticulo.Text = "";
                    _articuloSeleccionado = null;
                    MessageBox.Show("No existe el articulo.", "Info");
                }

                txtAgregarCantidad.Focus();
            }
        }

        private void txtAgregarCantidad_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter && txtAgregarCantidad.Text.Trim() != "")
                btnIngresarArticulo_Click(new object(), new RoutedEventArgs());
        }

        # endregion

        # region calcular subtotales

        private void calcularSubtotal1()
        {
            // Seteo el Subtotal1
            float st1 = 0;
            foreach (ItemFactura i in grdArticulos.Items)
                st1 += i.importe;

            txtSubtotal1.Text = NormalizarControlesHelper.normalizarDecimales(st1.ToString(), 2); // Math.Round(double.Parse(st1.ToString()), 2).ToString();
        }

        private void calcularSubtotal2()
        {
            string st2 = "0";
            if (txtImpuesto.Text != "")
            {
                //Subtotal1 + Impuesto $ 
                st2 = (float.Parse(txtSubtotal1.Text) + float.Parse(txtImpuesto.Text)).ToString();
            }

            txtSubtotal2.Text = NormalizarControlesHelper.normalizarDecimales(st2, 2); //Math.Round(double.Parse(st2), 2).ToString();
        }

        private void calcularSubtotal3()
        {
            string st3 = "0";
            if (txtDescuento.Text != "")
            {
                //Subtotal1 - Descuento %
                st3 = (float.Parse(txtSubtotal1.Text) - (float.Parse(txtSubtotal1.Text) * float.Parse(txtDescuento.Text) / 100)).ToString();
            }

            txtSubtotal3.Text = NormalizarControlesHelper.normalizarDecimales(st3, 2); //Math.Round(double.Parse(st3), 2).ToString();
        }

        private void calcularIVA()
        {
            string iva = (float.Parse(txtSubtotal1.Text) + (float.Parse(txtSubtotal1.Text) * 21 / 100)).ToString();
            txtIVA.Text = NormalizarControlesHelper.normalizarDecimales(iva, 2);
        }

        private void calcularTotal()
        { 
            //total = st1 + imp - desc + iva

            float t = 0;
            if (txtSubtotal1.Text != "")
                t += float.Parse(txtSubtotal1.Text);

            if (txtImpuesto.Text != "")
                t += float.Parse(txtImpuesto.Text);

            if (txtDescuento.Text != "")
                t -= (t * float.Parse(txtDescuento.Text) / 100);

            if (txtIVA.Text != "")
                t += (t * 21 / 100);

            txtTotal.Text = NormalizarControlesHelper.normalizarDecimales(t.ToString(), 2); //Math.Round(double.Parse(t.ToString()), 2).ToString();
        }

        # endregion

        private void btnImprimir_Click(object sender, RoutedEventArgs e)
        {
            VisorReportesWPF rpt = new VisorReportesWPF();
            rpt.titulo = "Factura";
            rpt.dataSources = new List<KeyValuePair<string, object>>();
            rpt.dataSources.Add(new KeyValuePair<string, object>("ItemsFactura", grdArticulos.ItemsSource));
            rpt.reportName = @"Reportes\FacturaReporte.rdlc";
            rpt.tieneSubReporte = true;

            ReportParameter p1 = new ReportParameter("Cliente", txtCliente.Text); //hide
            ReportParameter p2 = new ReportParameter("Domicilio", txtDomicilioCliente.Text); //hide
            ReportParameter p3 = new ReportParameter("MostrarCuit", (!chkIva.IsChecked).ToString()); //hide
            
            ReportParameter p4 = new ReportParameter("Cuit", " "); //hide
            if (chkIva.IsChecked == true)
                p4 = new ReportParameter("Cuit", txtCuit.Text); //hide

            ReportParameter p5 = new ReportParameter("Telefono", txtTelefonoCliente.Text); //hide
            ReportParameter p6 = new ReportParameter("FechaEmision", txtFechaEmision.Text); //hide
            ReportParameter p7 = new ReportParameter("NumeroFactura", txtFacturaNumero.Text); //hide
            ReportParameter p8 = new ReportParameter("Total", txtTotal.Text); //hide

            IEnumerable<ReportParameter> parametros = new ReportParameter[] { p1, p2, p3, p4, p5, p6, p7, p8 };
            rpt.parameters = parametros;
            
            rpt.ShowDialog();
        }

        private void btnBuscar_Click(object sender, RoutedEventArgs e)
        {
            if (_isDirty || _isDirtyItem)
            {
                MessageBoxResult rv = (MessageBox.Show(MensajeValidacionHelper.MensajeValidacionDatosModificados, "Info", MessageBoxButton.YesNo));
                
                if (rv == MessageBoxResult.No)
                    return;
            }
            
            RoutedEventArgs newEventArgs = new RoutedEventArgs(EventControlesHelper.BuscarFacturaClickEvent);

            RaiseEvent(newEventArgs);
        }
    }
}
